package kr.pe.johnkim.app.mobile.rest.dao;

import kr.pe.johnkim.app.domain.MyHistoryCategory;
import kr.pe.johnkim.app.domain.MyHistoryItem;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;

import java.util.List;

/**
 * My History 카테고리 관련 기능들을 구현한 클래스이다.
 * 
 * @author : johnkim <cale9797@gmail.com / Simple.ly Inc,>
 * @Date : 11. 12. 26
 */
public class MyHistoryCategoryDaoImpl extends SqlMapClientDaoSupport implements MyHistoryCategoryDao {
    // SLF4J Logging
	private Logger logger = LoggerFactory.getLogger(MyHistoryCategoryDaoImpl.class);

    /**
     * 카테고리 중복을 확인 한다.
     *
     * @param myHistoryCategory
     * @return MyHistoryCategory
     */

    public MyHistoryCategory checkDuplication(MyHistoryCategory myHistoryCategory) {
        logger.info("checkDuplication");
        return (MyHistoryCategory)getSqlMapClientTemplate().queryForObject("MYHISTORY_CATEGORY.checkDuplication", myHistoryCategory);
    }

    /**
     * 카테고리를 등록 한다.
     *
     * @param myHistoryCategory
     * @return True or False
     */
    public boolean registerCategory(MyHistoryCategory myHistoryCategory) {
        logger.info("registerCategory");

        boolean result = false;

        try {
            getSqlMapClientTemplate().insert("MYHISTORY_CATEGORY.registerCategory", myHistoryCategory);
            result = true;
        } catch (Exception e) {
            result = false;
        }

        return result;
    }

    /**
     * 카테고리 목록을 가져 온다.
     *
     * @param myHistoryCategory
     * @return List<MyHistoryCategory>
     */
    public List<MyHistoryCategory> selectCategoryList(MyHistoryCategory myHistoryCategory) {
        logger.info("selectCategoryList");
        return this.getSqlMapClientTemplate().queryForList("MYHISTORY_CATEGORY.selectCategoryList", myHistoryCategory);
    }

    /**
     * 카테고리 전체 갯수를 가져 온다.
     *
     * @param myHistoryCategory
     * @return MyHistoryCategory
     */
    public MyHistoryCategory selectCategoryCount(MyHistoryCategory myHistoryCategory) {
        logger.info("selectCategoryCount");
        return (MyHistoryCategory)getSqlMapClientTemplate().queryForObject("MYHISTORY_CATEGORY.selectCategoryCount", myHistoryCategory);
    }

    /**
     * 카테고리 상세 정보를 가져 온다.
     *
     * @param myHistoryCategory
     * @return MyHistoryCategory
     */
    public MyHistoryCategory selectCategory(MyHistoryCategory myHistoryCategory) {
        logger.info("selectCategory");
        return (MyHistoryCategory)getSqlMapClientTemplate().queryForObject("MYHISTORY_CATEGORY.selectCategory", myHistoryCategory);
    }

    /**
     * 카테고리 내용을 수정 한다.
     *
     * @param myHistoryCategory
     * @return True or False
     */
    public boolean updateCategory(MyHistoryCategory myHistoryCategory) {
        logger.info("updateCategory");

        boolean result = false;

        try {
            getSqlMapClientTemplate().update("MYHISTORY_CATEGORY.updateCategory", myHistoryCategory);
            result = true;
            logger.info("Success to update category.");
        } catch (Exception e) {
            result = false;
            logger.error("Fail to update category.");
        }
        
        return result;
    }

    /**
     * 카테고리를 비 활성화 한다.
     *
     * @param myHistoryCategory
     * @return True or False
     */
    public boolean updateDeactivateCategory(MyHistoryCategory myHistoryCategory) {
        logger.info("updateDeactivateCategory");

        boolean result = false;

        try {
            getSqlMapClientTemplate().update("MYHISTORY_CATEGORY.updateDeactivateCategory", myHistoryCategory);
            result = true;
        } catch (Exception e) {
            result = false;
        }
        
        return result;
    }

    /**
     * 카테고리를 즐겨 찾기에서 등록 한다.
     *
     * @param myHistoryCategory
     * @return True or False
     */
    public boolean updateFavoriteCategory(MyHistoryCategory myHistoryCategory) {
        logger.info("updateFavoriteCategory");

        boolean result = false;

        try {
            getSqlMapClientTemplate().update("MYHISTORY_CATEGORY.updateFavoriteCategory", myHistoryCategory);
            result = true;
        } catch (Exception e) {
            result = false;
        }

        return result;
    }

    /**
     * 카테고리를 즐겨 찾기에서 등록 해제 한다.
     *
     * @param myHistoryCategory
     * @return True or False
     */
    public boolean updateDeactivateFavoriteCategory(MyHistoryCategory myHistoryCategory) {
        logger.info("updateDeactivateFavoriteCategory");

        boolean result = false;

        try {
            getSqlMapClientTemplate().update("MYHISTORY_CATEGORY.updateDeactivateFavoriteCategory", myHistoryCategory);
            result = true;
        } catch (Exception e) {
            result = false;
        }

        return result;
    }

    /**
     * Category Analysis 화면에서 출력할 item 목록을 가져 온다.
     *
     * @param myHistoryItem
     * @return List<MyHistoryItem>
     */
    @Override
    public List<MyHistoryItem> selectItemListForCategoryAnalysis(MyHistoryItem myHistoryItem) {
        logger.info("selectItemListForCategoryAnalysis");
        return this.getSqlMapClientTemplate().queryForList("MYHISTORY_CATEGORY.selectItemListForCategoryAnalysis", myHistoryItem);
    }

    /**
     * Group 의 Category 목록을 가져 온다.
     * <p/>
     * 비활성의 목적으로 사용 한다.
     *
     * @param myHistoryCategory
     * @return
     */
    @Override
    public List<MyHistoryCategory> selectCategoryListForGroup(MyHistoryCategory myHistoryCategory) {
        logger.info("selectCategoryListForGroup");
        return this.getSqlMapClientTemplate().queryForList("MYHISTORY_CATEGORY.selectCategoryListForGroup", myHistoryCategory);
    }

    /**
     * Drink Category 목록을 등록 한다.
     *
     * @param myHistoryCategory
     */
    @Override
    public void registerCategoryList(MyHistoryCategory myHistoryCategory) {
        logger.info("registerCategoryList");

        try {
            getSqlMapClientTemplate().insert("MYHISTORY_CATEGORY.registerCategoryList", myHistoryCategory);
            logger.info("Success to register category list.");
        } catch (Exception e) {
            logger.error("Fail to register category list.");
        }
    }

    /**
     * Item 목록을 등록 하기 위해서 미리 등록된 Category 목록을 가져 온다.
     *
     * @param myHistoryCategory
     * @return
     */
    @Override
    public List<MyHistoryCategory> selectCategoryListForRegisterItemList(MyHistoryCategory myHistoryCategory) {
        logger.info("selectCategoryListForRegisterItemList");
        return this.getSqlMapClientTemplate().queryForList("MYHISTORY_CATEGORY.selectCategoryListForRegisterItemList", myHistoryCategory);
    }
}
